package cn.demoncat.util.web.intercept;

import cn.demoncat.util.web.TokenUtil;
import cn.demoncat.util.web.config.AppProperties;
import cn.demoncat.util.web.constant.HttpConstant.Method;
import cn.demoncat.util.web.constant.TokenTypeEnum;
import cn.demoncat.util.web.entity.Access;
import cn.demoncat.util.web.entity.TokenLog;
import cn.demoncat.util.web.util.AccessLogUtil;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Access拦截器
 *
 * 功能：创建Access，输出访问日志
 *
 * 执行顺序：preHandle > 执行Controller > postHandle > 渲染View > afterCompletion
 *
 * @author 延晓磊
 *
 * @since 2017年4月26日
 */
@Component("accessInterceptor")
public class AccessInterceptor implements HandlerInterceptor {

	@Resource
	private AppProperties appProperties;

	/**
	 * 前置拦截器
	 *
	 * 1、执行Controller前执行
	 * 2、防止后置拦截器不执行（造成请求数据错乱），需执行相应的数据清除或重置
	 */
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler){
		// 过滤OPTIONS请求
		if (Method.OPTIONS.equals(request.getMethod()) ) {
			return true;
		}
				
		// 获取访问信息
		Access access = TokenUtil.getAccess(request, appProperties.getId());
				
		// 记录访问日志
		AccessLogUtil.info(new TokenLog(TokenTypeEnum.ACCESS, access));
		
		// 放行请求
		return true;
	}

	/**
	 * 后置拦截器
	 *
	 * 1、执行Controller后执行
	 * 2、前置拦截器return false时不执行
	 * 3、主要用于修改返回值、清理数据、记录日志
	 */
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {

	}

	/**
	 * 最终拦截器
	 *
	 * 1、渲染页面后执行
	 * 2、前置拦截器return false时不执行
	 * 3、主要用于清理数据、记录日志
	 */
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
		// 清除访问信息
		TokenUtil.clearAccess();
	}
	
	
}
